package me.seawenc.db.checker.bean;

import com.alibaba.fastjson.JSON;
import me.seawenc.db.checker.helper.FileHelper;
import me.seawenc.db.checker.helper.Log;
import me.seawenc.db.checker.helper.Optionalx;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * 执行类的参数
 */
public class ExecParameters {
    // 是否是导出元数据
    private boolean isExport=false;
    // 是否执行检查
    private boolean isCheck=false;
    // 是否是显示帮助
    private boolean isHelper=false;
    // 配置文件路径
    private String configPath="conf/check.properties";
    // 元数据文件路径，默认为
    private String checkPath="metadata.json";

    /**
     * 无参构造
     */
    public ExecParameters() {
    }


    /**
     * 数据初始化
     * @param args args
     * @return ExecParameters
     */
    public static ExecParameters getInstance(String[] args) {
        ExecParameters parameters = new ExecParameters();
        parameters.assembleParams(args);
        parameters.assertParams();
        Log.info("当前参数：%s", JSON.toJSONString(parameters));
        return parameters;
    }

    private void assertParams() {
        // 如果都为false则打印helper，退出
        if(!(isExport || isCheck)){
            printHelp();
        }
        if(isHelper){
            printHelp();
        }
        if(!configPath.endsWith("properties")){
            throw new IllegalArgumentException("配置文件只能是properties文件");
        }
        if(!checkPath.endsWith("json")){
            throw new IllegalArgumentException("fq文件只能是json文件");
        }
    }

    public static void printHelp() {
        System.out.println(FileHelper.readResFile("/help.txt"));
        System.exit(0);
    }

    /**
     * 组装传入参数
     * @param args
     */
    private void assembleParams(String... args) {
        // 过滤掉空参数（多输入了空格导致）
        args=Arrays.stream(args).filter(arg-> Optionalx.isPresent(arg)).collect(Collectors.toList()).toArray(new String[]{});

        //组装参数
        for (int i=0;i< args.length;i++){
            String arg=args[i]+"";
            if("--help".equals(arg) || "-h".equals(arg)){
                isHelper=true;
            }
            if("--export".equals(arg) || "-e".equals(arg)){
                isExport=true;
                //如果是最后一个参数，则不进行下面获取checkPath，因为会数据越界
                if(i== args.length-1)continue;
                if(!args[i+1].startsWith("-")){
                    checkPath=args[++i];
                }
            }
            if("--check".equals(arg) || "-c".equals(arg)){
                isCheck=true;
                //如果是最后一个参数，则不进行下面获取checkPath，因为会数据越界
                if(i== args.length-1)continue;
                if(!args[i+1].startsWith("-")){
                    checkPath=args[++i];
                }
            }
            if(" --config".equals(arg) || " -C".equals(arg)){
                configPath=args[++i];
            }
        }
        // 如果同时传了检查与导出，则只执行导出
        if(isCheck && isExport) isCheck=false;
    }

    public boolean isExport() {
        return isExport;
    }

    public boolean isCheck() {
        return isCheck;
    }

    public boolean isHelper() {
        return isHelper;
    }

    public String getConfigPath() {
        return configPath;
    }

    public String getCheckPath() {
        return checkPath;
    }

    public void setCheckPath(String checkPath) {
        this.checkPath = checkPath;
    }
}
